package org.pictual.business.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import org.apache.log4j.Logger;
import org.pictual.business.dao.exceptions.DAOException;
import org.pictual.business.vo.CompletoVO;
import org.pictual.business.vo.IdiomaVO;
import org.pictual.util.PalabraEnTabla;


public class MySqlIdiomaDAO implements IdiomaDAO {

	private Connection connection;
	private ResourceBundle queries=ResourceBundle.getBundle("org.pictual.business.dao.MySqlIdiomaDAO");
	protected static Logger log= Logger.getLogger(MySqlIdiomaDAO.class);

	public MySqlIdiomaDAO(){}

	public MySqlIdiomaDAO(Connection connection){
		this.connection=connection;
	}

	public IdiomaVO readIdioma(String nombre, int idioma) throws DAOException {
		AccesoBD accesoBD = new AccesoBD();
		ResultSet rs=null;
		IdiomaVO idiomaVO = null;
		final String query=queries.getString("readIdioma");

		try {
			rs = accesoBD.ejecutarConsulta(
					query, 
					nombre,
					idioma);

			if(rs!=null){

				while(rs.next()){
					idiomaVO=new IdiomaVO();
					idiomaVO.setPalabra_id(rs.getInt("palabra_id"));
					idiomaVO.setIdioma(rs.getInt("idioma"));
					idiomaVO.setNombre(rs.getString("nombre"));
					idiomaVO.setVisitas(rs.getInt("visitas"));
					idiomaVO.setContador_wiki(rs.getInt("contador_wiki"));
					idiomaVO.setPronunciacion(rs.getString("pronunciacion"));
					idiomaVO.setGenero(rs.getString("genero"));
					idiomaVO.setPlural(rs.getString("plural"));
					idiomaVO.setAudio(rs.getString("audio"));
					idiomaVO.setVerbo(rs.getString("verbo"));
					idiomaVO.setSustantivo(rs.getBoolean("sustantivo"));
					idiomaVO.setOtro(rs.getBoolean("otro"));
					idiomaVO.setCompleto(rs.getBoolean("completo"));
					idiomaVO.setAutoactualizado(rs.getInt("autoactualizado"));
					idiomaVO.setEquivalente_es(rs.getString("equivalente_es"));
					idiomaVO.setEquivalente_en(rs.getString("equivalente_en"));
					idiomaVO.setEquivalente_de(rs.getString("equivalente_de"));
					idiomaVO.setEquivalente_fr(rs.getString("equivalente_fr"));
					idiomaVO.setConjugacion_verbo(rs.getString("conjugacion_verbo"));
					idiomaVO.setFecha_completo(rs.getDate("fecha_completo"));
					idiomaVO.setCod_audio(rs.getString("cod_audio"));

					log.info("Obtencion de IdiomaVO de "+idiomaVO.getNombre()+"con id "+idiomaVO.getPalabra_id()+" de base de datos con exito");
				}
			}
		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		} finally{
			accesoBD.desconectar();
			accesoBD.cerrarResultSet(rs);
		}

		return idiomaVO;
	}

	/**
	 * @deprecated
	 * @param nombre
	 * @param idioma
	 * @return
	 * @throws DAOException
	 */
	public IdiomaVO readIdioma2(String nombre, int idioma) throws DAOException {
		ResultSet rs=null;
		PreparedStatement ps=null;
		IdiomaVO idiomaVO = null;
		final String query=queries.getString("readIdioma");
		try {
			if(null == ps){ 
				ps= connection.prepareStatement(query);
				ps.setString(1, nombre);
				ps.setInt(2, idioma);
				rs = ps.executeQuery();
				while(rs.next()){
					idiomaVO=new IdiomaVO();
					idiomaVO.setPalabra_id(rs.getInt("palabra_id"));
					idiomaVO.setIdioma(rs.getInt("idioma"));
					idiomaVO.setNombre(rs.getString("nombre"));
					idiomaVO.setVisitas(rs.getInt("visitas"));
					idiomaVO.setContador_wiki(rs.getInt("contador_wiki"));
					idiomaVO.setPronunciacion(rs.getString("pronunciacion"));
					idiomaVO.setGenero(rs.getString("genero"));
					idiomaVO.setPlural(rs.getString("plural"));
					idiomaVO.setAudio(rs.getString("audio"));
					idiomaVO.setVerbo(rs.getString("verbo"));
					idiomaVO.setSustantivo(rs.getBoolean("sustantivo"));
					idiomaVO.setOtro(rs.getBoolean("otro"));
					idiomaVO.setCompleto(rs.getBoolean("completo"));
					idiomaVO.setAutoactualizado(rs.getInt("autoactualizado"));
					idiomaVO.setEquivalente_es(rs.getString("equivalente_es"));
					idiomaVO.setEquivalente_en(rs.getString("equivalente_en"));
					idiomaVO.setEquivalente_de(rs.getString("equivalente_de"));
					idiomaVO.setEquivalente_fr(rs.getString("equivalente_fr"));
					idiomaVO.setConjugacion_verbo(rs.getString("conjugacion_verbo"));
					idiomaVO.setFecha_completo(rs.getDate("fecha_completo"));
					idiomaVO.setCod_audio(rs.getString("cod_audio"));

					log.info("Obtencion de IdiomaVO de "+idiomaVO.getNombre()+"con id "+idiomaVO.getPalabra_id()+" de base de datos con exito");
				}
			}

		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		} finally {
			try {
				rs.close();
				ps.close();
				//				connection.close();
			} catch (SQLException e) {
				log.error("Error al cerrar la consulta: "+query, e);
			}
		}

		return idiomaVO;
	}

	public void insertIdioma(IdiomaVO idiomaVO) throws DAOException {
		String query =queries.getString("insertIdioma");

		AccesoBD accesoBD = new AccesoBD();

		try {

			/*
			 * INSERT INTO palabra_idioma (
			 * palabra_id, 
			 * idioma, 
			 * nombre, 
			 * visitas, 
			 * contador_wiki, 
			 * pronunciacion, 
			 * genero, 
			 * plural, 
			 * audio, 
			 * verbo, 
			 * sustantivo, 
			 * otro, 
			 * completo, 
			 * autoactualizado, 
			 * equivalente_es, 
			 * equivalente_en, 
			 * equivalente_de, 
			 * equivalente_fr, 
			 * conjugacion_verbo, 
			 * fecha_completo, 
			 * cod_audio) 
			 * VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
			 * 
			 */

			accesoBD.ejecutarActualizacion(
					query, 
					idiomaVO.getPalabra_id(),
					idiomaVO.getIdioma(),
					idiomaVO.getNombre(),
					idiomaVO.getVisitas(),
					idiomaVO.getContador_wiki(),
					idiomaVO.getPronunciacion(),
					idiomaVO.getGenero(),
					idiomaVO.getPlural(),
					idiomaVO.getAudio(),
					idiomaVO.getVerbo(),
					idiomaVO.isSustantivo(),
					idiomaVO.isOtro(),
					idiomaVO.isCompleto(),
					idiomaVO.getAutoactualizado(),
					idiomaVO.getEquivalente_es(),
					idiomaVO.getEquivalente_en(),
					idiomaVO.getEquivalente_de(),
					idiomaVO.getEquivalente_fr(),
					idiomaVO.getConjugacion_verbo(),
					idiomaVO.getFecha_completo(),
					idiomaVO.getCod_audio()
					);
		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		} finally{
			accesoBD.desconectar();
		}
	}

	/**
	 * @deprecated
	 * @param idiomaVO
	 * @throws DAOException
	 */
	public void insertIdioma2(IdiomaVO idiomaVO) throws DAOException {
		String query =queries.getString("insertIdioma");
		PreparedStatement ps=null;
		try {
			if(null == ps){
				ps=connection.prepareStatement(query);

				ps.setInt(1, idiomaVO.getPalabra_id());
				ps.setInt(2, idiomaVO.getIdioma());
				ps.setString(3, idiomaVO.getNombre());
				ps.setInt(4, idiomaVO.getVisitas());
				ps.setInt(5, idiomaVO.getContador_wiki());
				ps.setString(6, idiomaVO.getPronunciacion());
				ps.setString(7, idiomaVO.getGenero());
				ps.setString(8, idiomaVO.getPlural());
				ps.setString(9, idiomaVO.getAudio());
				ps.setString(10, idiomaVO.getVerbo());
				ps.setBoolean(11, idiomaVO.isSustantivo());
				ps.setBoolean(12, idiomaVO.isOtro());
				ps.setBoolean(13, idiomaVO.isCompleto());
				ps.setInt(14, idiomaVO.getAutoactualizado());
				ps.setString(15, idiomaVO.getEquivalente_es());
				ps.setString(16, idiomaVO.getEquivalente_en());
				ps.setString(17, idiomaVO.getEquivalente_de());
				ps.setString(18, idiomaVO.getEquivalente_fr());
				ps.setString(19, idiomaVO.getConjugacion_verbo());
				ps.setDate(20, (Date) idiomaVO.getFecha_completo());
				ps.setString(21, idiomaVO.getCod_audio());

				ps.executeUpdate();
				log.info("Inserción de IdiomaVO de"+idiomaVO.getNombre()+" en base de datos con exito");
			}
		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		}  finally {
			try {
				ps.close();
				//				connection.close();
			} catch (SQLException e) {
				log.error("Error al cerrar la consulta: "+query, e);
			}
		}

	}

	public List<CompletoVO> selectlistadoMasVisitadas(int visitas) throws DAOException{
		AccesoBD accesoBD = new AccesoBD();
		ResultSet rs=null;
		List<CompletoVO> listado = new ArrayList<CompletoVO>();
		CompletoVO completo;
		String query=queries.getString("selectlistadoMasVisitadas");
		
		try {
			
			rs = accesoBD.ejecutarConsulta(
					query,
					visitas);

			if(rs!=null){
				while(rs.next()){
					completo=new CompletoVO();
					completo.setAudio(rs.getString("audio"));
					completo.setCod_audio(rs.getString("cod_audio"));
					completo.setConjugacion(rs.getString("conjugacion"));
					completo.setD1(rs.getString("d1"));
					completo.setD2(rs.getString("d2"));
					completo.setD3(rs.getString("d3"));
					completo.setDe(rs.getString("de"));
					completo.setE1(rs.getString("e1"));
					completo.setE2(rs.getString("e2"));
					completo.setE3(rs.getString("e3"));
					completo.setEn(rs.getString("en"));
					completo.setEs(rs.getString("es"));
					completo.setFr(rs.getString("fr"));
					completo.setGenero(rs.getString("genero"));
					completo.setId(rs.getInt("id"));
					completo.setIdioma(rs.getInt("idioma"));
					completo.setInfo(rs.getString("info"));
					completo.setOtro(rs.getString("otro"));
					completo.setPalabra(rs.getString("palabra"));
					completo.setPlural(rs.getString("plural"));
					completo.setPronunciacion(rs.getString("pronunciacion"));
					completo.setSustantivo(rs.getString("sustantivo"));
					completo.setVerbo(rs.getString("verbo"));
					completo.setWiki(rs.getInt("wiki"));

					listado.add(completo);
				}
			}

			log.info("Obtencion del listado de palabras de base de datos con exito");
		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		} finally{
			accesoBD.cerrarResultSet(rs);
			accesoBD.desconectar();
		}

		return listado;
	}
	
	public List<CompletoVO> selectListado(String wiki, String order, String images) throws DAOException {
		AccesoBD accesoBD = new AccesoBD();
		ResultSet rs=null;
		List<CompletoVO> listado = new ArrayList<CompletoVO>();
		CompletoVO completo;
		String query=queries.getString("selectListadoCompleto");
		
		
		
		
		//Si tiene parametro images
		if(images != null){
			if(images.equals("false")){

				if(order!=null){
					if(order.equals("nombre")) query=queries.getString("selectListadoWithoutImgByNombre");
					if(order.equals("id")) query=queries.getString("selectListadoWithoutImgById");

				}else{
					query=queries.getString("selectListadoWithoutImg");
				}
			}

			if(images.equals("true")){

				if(order!=null){
					if(order.equals("nombre")) query=queries.getString("selectListadoWithImgByNombre");
					if(order.equals("id")) query=queries.getString("selectListadoWithImgById");

				}else{
					query=queries.getString("selectListadoWithImg");
				}

			}
			
		}else{
			if(wiki == null){
				if(order!=null){
					if(order.equals("nombre")) query=queries.getString("selectListadoCompletoByNombre");
					if(order.equals("id")) query=queries.getString("selectListadoCompletoById");
				}
			}else{
				if(order!=null){
					if(order.equals("nombre")) query=queries.getString("selectListadoWikiByNombre");
					if(order.equals("id")) query=queries.getString("selectListadoWikiById");

				}else{
					query=queries.getString("selectListadoWiki");
				}
			}
		}
		
		try {
			
			if(wiki!=null)
				rs = accesoBD.ejecutarConsulta(
					query, 
					wiki);
			
			else
				rs = accesoBD.ejecutarConsulta(
					query);

			if(rs!=null){
				while(rs.next()){
					completo=new CompletoVO();
					completo.setAudio(rs.getString("audio"));
					completo.setCod_audio(rs.getString("cod_audio"));
					completo.setConjugacion(rs.getString("conjugacion"));
					completo.setD1(rs.getString("d1"));
					completo.setD2(rs.getString("d2"));
					completo.setD3(rs.getString("d3"));
					completo.setDe(rs.getString("de"));
					completo.setE1(rs.getString("e1"));
					completo.setE2(rs.getString("e2"));
					completo.setE3(rs.getString("e3"));
					completo.setEn(rs.getString("en"));
					completo.setEs(rs.getString("es"));
					completo.setFr(rs.getString("fr"));
					completo.setGenero(rs.getString("genero"));
					completo.setId(rs.getInt("id"));
					completo.setIdioma(rs.getInt("idioma"));
					completo.setInfo(rs.getString("info"));
					completo.setOtro(rs.getString("otro"));
					completo.setPalabra(rs.getString("palabra"));
					completo.setPlural(rs.getString("plural"));
					completo.setPronunciacion(rs.getString("pronunciacion"));
					completo.setSustantivo(rs.getString("sustantivo"));
					completo.setVerbo(rs.getString("verbo"));
					completo.setWiki(rs.getInt("wiki"));

					listado.add(completo);
				}
			}

			log.info("Obtencion del listado de palabras de base de datos con exito");
		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		} finally{
			accesoBD.cerrarResultSet(rs);
			accesoBD.desconectar();
		}

		return listado;
	}

	/**
	 * AccesoBD
	 */
	public CompletoVO selectPalabraCompleta(String palabra, int idioma,int wiki) throws DAOException{
		AccesoBD accesoBD = new AccesoBD();
		ResultSet rs=null;
		CompletoVO completo = null;
		final String query=queries.getString("selectPalabraCompleta");

		try {
			rs = accesoBD.ejecutarConsulta(
					query, 
					palabra,
					idioma,
					wiki);

			if(rs!=null){

				while(rs.next()){
					completo=new CompletoVO();
					completo.setAudio(rs.getString("audio"));
					completo.setCod_audio(rs.getString("cod_audio"));
					completo.setConjugacion(rs.getString("conjugacion"));
					completo.setD1(rs.getString("d1"));
					completo.setD2(rs.getString("d2"));
					completo.setD3(rs.getString("d3"));
					completo.setDe(rs.getString("de"));
					completo.setE1(rs.getString("e1"));
					completo.setE2(rs.getString("e2"));
					completo.setE3(rs.getString("e3"));
					completo.setEn(rs.getString("en"));
					completo.setEs(rs.getString("es"));
					completo.setFr(rs.getString("fr"));
					completo.setGenero(rs.getString("genero"));
					completo.setId(rs.getInt("id"));
					completo.setIdioma(rs.getInt("idioma"));
					completo.setInfo(rs.getString("info"));
					completo.setOtro(rs.getString("otro"));
					completo.setPalabra(rs.getString("palabra"));
					completo.setPlural(rs.getString("plural"));
					completo.setPronunciacion(rs.getString("pronunciacion"));
					completo.setSustantivo(rs.getString("sustantivo"));
					completo.setVerbo(rs.getString("verbo"));
					completo.setWiki(rs.getInt("wiki"));

					log.info("Obtencion de CompletoVO de "+completo.getPalabra()+"con id "+completo.getId()+" de base de datos con exito");
				}
			}
		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		} finally{
			accesoBD.desconectar();
			accesoBD.cerrarResultSet(rs);
		}
		return completo;
	}
	/**
	 * @deprecated
	 */
	public CompletoVO selectPalabraCompleta2(String palabra, int idioma, int wiki)
			throws DAOException {
		ResultSet rs=null;
		PreparedStatement ps=null;
		CompletoVO completo = null;
		final String query=queries.getString("selectPalabraCompleta");
		try {
			if(null == ps){
				ps= connection.prepareStatement(query);
				ps.setString(1, palabra);
				ps.setInt(2, idioma);
				ps.setInt(3, wiki);
				rs = ps.executeQuery();
				while(rs.next()){
					completo=new CompletoVO();
					completo.setAudio(rs.getString("audio"));
					completo.setCod_audio(rs.getString("cod_audio"));
					completo.setConjugacion(rs.getString("conjugacion"));
					completo.setD1(rs.getString("d1"));
					completo.setD2(rs.getString("d2"));
					completo.setD3(rs.getString("d3"));
					completo.setDe(rs.getString("de"));
					completo.setE1(rs.getString("e1"));
					completo.setE2(rs.getString("e2"));
					completo.setE3(rs.getString("e3"));
					completo.setEn(rs.getString("en"));
					completo.setEs(rs.getString("es"));
					completo.setFr(rs.getString("fr"));
					completo.setGenero(rs.getString("genero"));
					completo.setId(rs.getInt("id"));
					completo.setIdioma(rs.getInt("idioma"));
					completo.setInfo(rs.getString("info"));
					completo.setOtro(rs.getString("otro"));
					completo.setPalabra(rs.getString("palabra"));
					completo.setPlural(rs.getString("plural"));
					completo.setPronunciacion(rs.getString("pronunciacion"));
					completo.setSustantivo(rs.getString("sustantivo"));
					completo.setVerbo(rs.getString("verbo"));
					completo.setWiki(rs.getInt("wiki"));
					log.info("Obtencion de CompletoVO de "+completo.getPalabra()+"con id "+completo.getId()+" de base de datos con exito");
				}
			}

		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		} finally {
			try {
				rs.close();
				ps.close();
				connection.close();
			} catch (SQLException e) {
				log.error("Error al cerrar la consulta: "+query, e);
			}
		}

		return completo;
	}

	public int selectIdPalabra(String palabra) throws DAOException {
		AccesoBD accesoBD = new AccesoBD();
		ResultSet rs=null;
		int idPalabra = 0;
		final String query=queries.getString("selectIdPalabra");

		try {
			rs = accesoBD.ejecutarConsulta(
					query, 
					palabra);

			if(rs!=null){

				while(rs.next()){
					idPalabra = rs.getInt("palabra_id");

					log.info("Obtencion del idPalabra de "+palabra+" de base de datos con exito");
				}
			}
		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		} finally{
			accesoBD.desconectar();
			accesoBD.cerrarResultSet(rs);
		}
		return idPalabra;
	}


	/**
	 * @deprecated
	 */
	public int selectIdPalabra2(String palabra) throws DAOException {
		ResultSet rs=null;
		PreparedStatement ps=null;
		int idPalabra = 0;
		final String query=queries.getString("selectIdPalabra");
		try {
			if(null == ps){ 
				ps= connection.prepareStatement(query);
				ps.setString(1, palabra);
				rs = ps.executeQuery();
				while(rs.next()){
					idPalabra = rs.getInt("palabra_id");

					log.info("Obtencion del idPalabra de "+palabra+" de base de datos con exito");
				}
			}

		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		} finally {
			try {
				rs.close();
				ps.close();
				connection.close();
			} catch (SQLException e) {
				log.error("Error al cerrar la consulta: "+query, e);
			}
		}

		return idPalabra;
	}

	@Override
	public int aumentarVisitas(IdiomaVO idiomaVO) throws DAOException {
		AccesoBD accesoBD = new AccesoBD();
		int visitas = idiomaVO.getVisitas()+1;
		final String query=queries.getString("aumentarVisitas");

		try {
			accesoBD.ejecutarActualizacion(
					query, 
					visitas,
					idiomaVO.getPalabra_id());

		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		} finally{
			accesoBD.desconectar();
		}
		
		return visitas;
	}



}
